//对象序列化，undefined和函数丢失问题
const JSONStringify = (option) => {
  return JSON.stringify(
    option,
    (key, val) => {
      // 处理函数丢失问题
      if (typeof val === "function") {
        return `${val}`;
      }
      //处理undefined丢失问题
      if (typeof val === "undefined") {
        return "undefined";
      }
      return val;
    },
    2
  );
};
//对象序列化解析
const JSONParse = (objstr) => {
  return JSON.parse(objstr, (k, v) => {
    if (typeof v === "string" && v.indexOf && v.indexOf("function") > -1) {
      // eval 可能在eslint 中报错，需要加入下行注释
      // eslint-disable-next-line
      return eval(`(function(){return ${v}})()`);
    }
    return v;
  });
};

function JSONDeepClone(obj) {
  //判断拷贝的要进行深拷贝的是数组还是对象，是数组的话进行数组拷贝，对象的话进行对象拷贝
  var objClone = Array.isArray(obj) ? [] : {};
  //进行深拷贝的不能为空
  if (obj && typeof obj === "object") {
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        if (obj[key] && typeof obj[key] === "object") {
          objClone[key] = JSONDeepClone(obj[key]);
        } else {
          objClone[key] = obj[key];
        }
      }
    }
  } else if (obj && typeof obj === "function") {
    objClone = obj;
    // objClone[key] = JSONParse(JSONStringify(obj[key]));
  }
  return objClone;
}

//测试
export { JSONStringify, JSONParse, JSONDeepClone };
